#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

/**
标准输入输出流 （File *）
  FILE *stdin;  标准输入
  FILE *stdout; 标准输出
  FILE *stderr; 标准错误输出
标准输出输出流的文件描述符
  STDIN_FILENO  0 标准输入
  STDOUT_FILENO  1 标准输出
  STDERR_FILENO  2 标准错误输出
*/
int main(int argc, char const *argv[])
{
    // 利用标准输入stdin读取终端输入
    // fgets() 从标准输入(stdin)读取用户输入
    // printf() 通过标准输出(stdout)打印内容
    // fputs() 分别通过标准输出(stdout)和标准错误输出(stderr)打印内容
    char input_name[10];
    fgets(input_name, 10, stdin);
    printf("stdin输入内容: %s", input_name);
    
    // 利用标准输出stdout向终端输出
    fputs("stdout输出内容\n", stdout);
    // 利用标准错误输出stderr向终端输出
    fputs("stderr输出内容 \n", stderr);

    //=================================================================

    //后半部分使用了系统调用函数：
    // read() 通过文件描述符STDIN_FILENO读取终端输入
    // write() 分别通过文件描述符STDOUT_FILENO和STDERR_FILENO向终端输出内容

    // 利用STDIN_FILENO读取终端输入
    char input_name2[10];
    ssize_t len = read(STDIN_FILENO, input_name2, 10);
    printf("STDIN_FILENO输入内容: %.*s",len, input_name2);

    // 利用STDOUT_FILENO向终端输出
    char *str = "STDOUT_FILENO输出内容\n";
    write(STDOUT_FILENO, str, strlen(str));
    // 利用STDERR_FILENO向终端输出
    char *str2 = "STDERR_FILENO输出内容\n";
    write(STDERR_FILENO, str2, strlen(str2));




    // 这两种方式的主要区别是：
    // 标准I/O库函数(前半部分)是缓冲的，效率更高，更适合一般编程
    // 系统调用(后半部分)是无缓冲的，更接近底层，效率较低但更直接
    return 0;
}